﻿/*
SINACOR - BMF&Bovespa
Arquivo: ConsolidacaoMovimentoBolsa.cs
Criado em: 17-mar-2010 16:37:58
Arquiteto Responsável: p-Wgeneroso
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Core.ProcessManager.Server;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using PSE.ProcessManager.Common.Process;
using PSE.ProcessManager.Server.Process.Security;
using Sinacor.Infra.Core.ProcessManager.Server.Security;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Infra.Common.Validation;


namespace Sinacor.Process.Bovespa.ControleMovimentoBolsa.Server.ProcessLogic 
{
    public class ConsolidacaoMovimentoBolsa : BaseProcessLogic
	{
	 
		#region Campos
		private int _erroMovimentoFechado = 109690;
		private int _erroNaoEsperado = 109689;
		private int _erroObjetoNulo = 109687;
		private int _erroSemPermissaoAcesso = 109688;
		#endregion	 	 
		#region Propriedades

		public int ErroMovimentoFechado
		{
			get { return _erroMovimentoFechado; }
			set { _erroMovimentoFechado = value; }
		}


		public int ErroNaoEsperado
		{
			get { return _erroNaoEsperado; }
			set { _erroNaoEsperado = value; }
		}


		public int ErroObjetoNulo
		{
			get { return _erroObjetoNulo; }
			set { _erroObjetoNulo = value; }
		}


		public int ErroSemPermissaoAcesso
		{
			get { return _erroSemPermissaoAcesso; }
			set { _erroSemPermissaoAcesso = value; }
		}
		#endregion
		#region Métodos
		/// <summary>
		/// Consolida o movimento bolsa
		/// </summary>
		/// <param name="entity"></param>
		public void ConsolidarMovimento(ProcessEntity.Parameter.FiltroControleMovimento entity)
		{
            if (entity != null)
            {
                if (this.VerificarPermissaoAcesso())
                {
                    SinacorValidation validation = new SinacorValidation();
                    validation.Validate<ProcessEntity.Parameter.FiltroControleMovimento>(entity);
                    validation.Validate();
                    validation = null;

                    if (this.VerificarMovimentoAberto())
                    {
                        ResourceAccess.ConsolidacaoMovimentoBolsa resourceAccsses = new Sinacor.Process.Bovespa.ControleMovimentoBolsa.Server.ResourceAccess.ConsolidacaoMovimentoBolsa();
                        ProcessEntity.Resultado resultado = new Sinacor.Process.Bovespa.ControleMovimentoBolsa.ProcessEntity.Resultado();
                        resultado = resourceAccsses.ConsolidarMovimento(entity);
                        if (!resultado.Sucesso)
                        {
                            if (resultado.CodigoErro == -1)
                            {
                                throw new BusinessException(ErroNaoEsperado);
                            }
                            else
                            {
                                this.TratarExcecoes(resultado);
                            }                        
                        }
                    }
                    else
                    {
                        throw new BusinessException(ErroMovimentoFechado);
                    }
                }
                else
                {
                    throw new BusinessException(ErroSemPermissaoAcesso);
                }
            }
            else
            {
                throw new BusinessException(ErroObjetoNulo);
            }

			//Verificar diagrama de atividades
			//ConsolidacaoMovimentoBolsa.
			//ConsolidarMovimento()		
		}

		/// <summary>
		/// Trata as exceções geradas na execução da abertura.
		/// </summary>
		/// <param name="entity"></param>
		private void TratarExcecoes(ProcessEntity.Resultado entity)
		{
            if (entity != null)
            {
                if (entity.Argumentos != null)
                {
                    ErrorMessage.ConvertXmlArgumentsToParameters(entity.Argumentos);
                    throw new BusinessException(ErroNaoEsperado);
                }
                else
                {
                    throw new BusinessException(ErroNaoEsperado);
                }
            }

			//1. Verificar se o resultado enviado no
			//parametro possui argumentos
			//
			//Se a propriedade "Argumentos" da
			//entidade enviada não estiver nula ou
			//vazia
			//
			//1.1. Existem argumentos, então consumir
			//o método Sinacor.Infra.Service.
			//ErrorMessage().
			//ConvertXmlArgumentsToParameters(entity.
			//Argumentos)
			//1.2. Gerar uma BusinessException
			//informando o codigo do erro e os
			//argumentos obtidos na ação anterior.
			//
			//SeNão
			//
			//2.1. Não existem argumentos, então
			//gerar um BusinessException informando o
			//codigo do erro.
			//
			//FimSe


			
		}

		/// <summary>
		/// Verifica se o estado do movimento atual está aberto
		/// </summary>
		private bool VerificarMovimentoAberto()
		{
            ProcessEntity.InformacoesMovimento informacoesMovimento = new Sinacor.Process.Bovespa.ControleMovimentoBolsa.ProcessEntity.InformacoesMovimento();
            Communication.ControleMovimentoBolsa communicationControleMovimento = new Sinacor.Process.Bovespa.ControleMovimentoBolsa.Server.Communication.ControleMovimentoBolsa();
            informacoesMovimento=communicationControleMovimento.ObterInformacoesMovimento(new ProcessEntity.DataMovimento());


            if (informacoesMovimento.EstadoMovimento == ProcessEntity.Enum.TipoMovimento.Aberto)
            {
                return true;
            }
            else
            {
                return false;
            }
			//igual a TipoMovimento.Aberto
			// Retornar verdadeiro.
			//SeNao
			// Retornar falso.
			//FimSe

			//1. Obter informações do movimento,
			//consumindo o método Communication.
			//ControleMovimentoBolsas.
			//ObterInformacoesMovimento() informando
			//no parametro a entidade vazia.
			//
			//Exemplo:
			//informacoesMovimento = Communication.
			//ControleMovimentoBolsas.
			//ObterInformacoesMovimento(new
			//ProcessEntity.DataMovimento());
			//
			//2. Verificar se o estado do movimento
			//está aberto.
			//
			//Se informacoesMovimento.EstadoMovimento
			//igual a TipoMovimento.Aberto
			// Retornar verdadeiro.
			//SeNao
			// Retornar falso.
			//FimSe			
		}

		/// <summary>
		/// Verificar se o usuário possui acesso para abrir o movimento.
		/// </summary>
		private bool VerificarPermissaoAcesso()
		{
            //Checar se o usuário possui acesso na
            //função "BCONSO"
            if (!AuthorizationContext<SinacorAuthorizationContext>.Current.CheckUserAccess("BCONSO", "BOL"))
            {
                throw new BusinessException(ErroSemPermissaoAcesso);
            }
            return true;
		}
		#endregion
	}

}